package cn.itcast.lucene;

import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;

import java.io.File;
import java.io.IOException;

public class CreateIndex {

    /**
     * 创建索引库
     */
    @Test
    public void createIndexTest() throws IOException {
        System.out.println("工程师第一次编写代码.............");
        System.out.println("工程师第er次编写代码.............");
        System.out.println("项目经理第一次编写代码.............");
        System.out.println("dev编写代码.............");
        //指定索引库位置
        FSDirectory directory = FSDirectory.open(new File("F:\\index92"));
        //StandardAnalyzer lucene默认使用的标准分词器 针对中文分词效果：逐字分词
       // Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_4_10_3);
        //CJKAnalyzer 每两个字组一个词
        //Analyzer analyzer = new CJKAnalyzer(Version.LUCENE_4_10_3);
        //ik分词器分词
        Analyzer analyzer = new IKAnalyzer();
        //IndexWriter配置对象  参数二：分词器，针对搜索内容分词
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3,analyzer);
        //1、创建写入索引库对象
        //参数一：索引库目录  参数二：IndexWriter配置对象
        IndexWriter indexWriter = new IndexWriter(directory,config);

        //创建索引数据
        //获取索引库数据来源  磁盘文件
        File fileDir = new File("F:\\searchsource");
        File[] files = fileDir.listFiles();
        //遍历文件
        for (File file : files) {
            //创建文档
            Document document = new Document();
            //参数一：字段名称 参数二：字段内容  参数三：是否存储
            //TextField类型字段，默认分词
            document.add(new TextField("fileName",file.getName(), Field.Store.YES));
            document.add(new TextField("fileContent", FileUtils.readFileToString(file), Field.Store.YES));
            document.add(new LongField("fileSize",FileUtils.sizeOf(file), Field.Store.YES));
            //StringField字段类型，默认不分词
            document.add(new StringField("filePath",file.getPath(), Field.Store.YES));

            //添加文档到索引库
            indexWriter.addDocument(document);


            //修改文档 原理：先基于参数一term词条，查询满足条件的数据，先删除这些数据，然后，再新增参数二指定的文档数
            //indexWriter.updateDocument(new Term("fileName","lucene"),doc);
        }

        //提交文档操作
        indexWriter.commit();
        //关闭资源
        indexWriter.close();

    }

    /**
     * 删除索引库文档
     */
    @Test
    public void deleteDocTest() throws IOException {
        //指定索引库位置
        FSDirectory directory = FSDirectory.open(new File("F:\\index92"));
        //StandardAnalyzer lucene默认使用的标准分词器 针对中文分词效果：逐字分词
        //ik分词器分词
        Analyzer analyzer = new IKAnalyzer();
        //IndexWriter配置对象  参数二：分词器，针对搜索内容分词
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3,analyzer);
        //1、创建写入索引库对象
        //参数一：索引库目录  参数二：IndexWriter配置对象
        IndexWriter indexWriter = new IndexWriter(directory,config);
        //删除所有
        //indexWriter.deleteAll();
        //基于词条删除
        //indexWriter.deleteDocuments(new Term("fileName","传智播客"));
        //基于查询删除
        Query query = NumericRangeQuery.newLongRange("fileSize",0L,50L,true,true);
        indexWriter.deleteDocuments(query);
        //提交文档操作
        indexWriter.commit();
        //关闭资源
        indexWriter.close();
    }
}
